package GUI.pdaGrafica;

import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JWindow;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import javax.swing.ListSelectionModel;

import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

import modelo.Restaurante;
import modelo.gestionPedidos.Pedido;
import modelo.gestionReserva.Mesa;

import java.awt.Point;
import java.util.List;
import java.util.ListIterator;

/**
 * Esta clase implementa la sección para la gestión de pedidos
 * 
 * @created 04-may-2007 01:09
 * @version 1.0
 * @author Enrique Menor Santos
 *
 */
public class Pedidos extends JWindow implements ActionListener, ListSelectionListener {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JScrollPane jSPedidos = null;

	private JButton jBVolver = null;

	private JButton jBEliminar = null;

	private JButton jBNuevo = null;

	private JButton jBAmpliar = null;

	private JButton jBEditar = null;
	/**
	 * Objeto restaurante a gestionar. Se pasará como parámetro al resto de clases visuales. 
	 */
	private Restaurante r;
	/**
	 * En este atributo almacenaremos el pedidos seleccionado
	 */
	private Pedido pedidoSeleccionado;  //  @jve:decl-index=0:
	/**
	 * Es la lista de todos los pedidos existentes en la BD
	 */
	private List<Pedido> listaPedidos;  //  @jve:decl-index=0:
	/**
	 * Lista que será la vista de la lista de Pedidos del Restaurante
	 */
	private JList jLPedidos = null;
	/**
	 * El modelo de la vista anterior. Contendrá los Pedidos del Restaurante
	 */
	private DefaultListModel listaModelo;

	/**
	 * Constructor público.
	 * 
	 * @param r: Como en todas las clases visuales se pasa el parámetro restaurante para mantenerlo vivo en memoria
	 */
	public Pedidos(Restaurante r) {
		this.r =r; 
		//obtenemos la lista de pedidos directamente de la BD a través del objeto restaurante
		listaPedidos = r.recuperarPedidos();
		if (listaPedidos==null)
			System.err.println("ERROR al recuperar de la BD la lista de pedidos desde la GUI PEDIDOS");
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(240, 320);
		this.setName("pedidos");
		this.setMinimumSize(new Dimension(240, 320));
		this.setMaximumSize(new Dimension(240, 320));
		this.setContentPane(getJContentPane());			
	}		

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "PEDIDOS", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jContentPane.setToolTipText("Seleccione alguna de las opciones relacionadas con los pedidos");
			jContentPane.setName("panelPedidos");
			jContentPane.add(getJSPedidos(), null);
			jContentPane.add(getJBVolver(), null);
			jContentPane.add(getJBEliminar(), null);
			jContentPane.add(getJBNuevo(), null);
			jContentPane.add(getJBAmpliar(), null);
			jContentPane.add(getJBEditar(), null);
		}
		return jContentPane;
	}	
	
	/**
	 * This method initializes jSPedidos	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSPedidos() {
		if (jSPedidos == null) {
			jSPedidos = new JScrollPane();
			jSPedidos.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED), "Pedidos Actuales:", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jSPedidos.setLocation(new Point(5, 24));
			jSPedidos.setViewportView(getJLPedidos());
			jSPedidos.setSize(new Dimension(230, 185));
		}
		return jSPedidos;
	}

	/**
	 * This method initializes jBVolver	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBVolver() {
		if (jBVolver == null) {
			jBVolver = new JButton();
			jBVolver.setToolTipText("Click para volver al menú principal");
			jBVolver.setMnemonic(KeyEvent.VK_V);
			jBVolver.setActionCommand("Volver");
			jBVolver.setIcon(new ImageIcon(getClass().getResource("/iconos/arrow_undo.png")));
			jBVolver.setText("Volver");
			jBVolver.setSize(new Dimension(105, 60));
			jBVolver.setLocation(new Point(125, 250));
			jBVolver.setName("servir");
			jBVolver.addActionListener(this);
		}
		return jBVolver;
	}

	/**
	 * This method initializes jBEliminar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBEliminar() {
		if (jBEliminar == null) {
			jBEliminar = new JButton();
			jBEliminar.setToolTipText("Click para eliminar un pedido");
			jBEliminar.setMnemonic(KeyEvent.VK_M);
			jBEliminar.setActionCommand("Eliminar");
			jBEliminar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_delete.png")));
			jBEliminar.setText("Eliminar");
			jBEliminar.setLocation(new Point(10, 285));
			jBEliminar.setSize(new Dimension(105, 25));
			jBEliminar.setEnabled(false);
			jBEliminar.setName("eliminar");
			jBEliminar.addActionListener(this);
		}
		return jBEliminar;
	}

	/**
	 * This method initializes jBNuevo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBNuevo() {
		if (jBNuevo == null) {
			jBNuevo = new JButton();
			jBNuevo.setToolTipText("Click para crear nuevo pedido");
			jBNuevo.setMnemonic(KeyEvent.VK_N);
			jBNuevo.setActionCommand("Nuevo");
			jBNuevo.setIcon(new ImageIcon(getClass().getResource("/iconos/table.png")));
			jBNuevo.setText("Nuevo");
			jBNuevo.setSize(new Dimension(105, 25));
			jBNuevo.setLocation(new Point(10, 215));
			jBNuevo.setPreferredSize(new Dimension(90, 25));
			jBNuevo.setName("nuevo");
			jBNuevo.addActionListener(this);
		}
		return jBNuevo;
	}

	/**
	 * This method initializes jBAmpliar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBAmpliar() {
		if (jBAmpliar == null) {
			jBAmpliar = new JButton();
			jBAmpliar.setToolTipText("Click para ampliar un pedido");
			jBAmpliar.setMnemonic(KeyEvent.VK_A);
			jBAmpliar.setActionCommand("Ampliar");
			jBAmpliar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_add.png")));
			jBAmpliar.setText("Ampliar");
			jBAmpliar.setSize(new Dimension(105, 25));
			jBAmpliar.setLocation(new Point(125, 215));
			jBAmpliar.setEnabled(false);
			jBAmpliar.setName("servir");
			jBAmpliar.addActionListener(this);
		}
		return jBAmpliar;
	}

	/**
	 * This method initializes jBEditar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBEditar() {
		if (jBEditar == null) {
			jBEditar = new JButton();
			jBEditar.setToolTipText("Click para editar las consumiciones del pedido");
			jBEditar.setMnemonic(KeyEvent.VK_E);
			jBEditar.setActionCommand("Editar");
			jBEditar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_edit.png")));
			jBEditar.setText("Editar");
			jBEditar.setSize(new Dimension(105, 25));
			jBEditar.setLocation(new Point(10, 250));
			jBEditar.setPreferredSize(new Dimension(90, 25));
			jBEditar.setEnabled(false);
			jBEditar.setName("servir");
			jBEditar.addActionListener(this);
		}
		return jBEditar;
	}
	
	/**
	 * This method initializes jLPedidos	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getJLPedidos() {
		if (jLPedidos == null) 
		{
			//nos creamos la lista modelo
			this.creaListaModelo();
			jLPedidos = new JList(listaModelo);
			jLPedidos.setModel(listaModelo);
			jLPedidos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			jLPedidos.addListSelectionListener(this);
			
		}
		return jLPedidos;
	}
	/**
	 * Método interno que me crea la lista modelo
	 *
	 */
	private void creaListaModelo() 
	{
		listaModelo = new DefaultListModel();
		//si hemos importado la lista de pedidos correctamente en el constructor, añadimos los pedidos a la lista del modelo
		if(listaPedidos != null)
		{				
			//recorremos la lista de pedidos y vamos insertando sus id
			ListIterator<Pedido> it= listaPedidos.listIterator();
			while(it.hasNext())
			{
				Pedido p = it.next();
				List<Mesa> lm = p.getMesas();
				String s = "Mesas: ";
				if (lm!=null)
				{
					//recorremos la lista de mesas asociadas al pedido incluyendo su numero de mesa
					ListIterator<Mesa> itm= lm.listIterator();
					while(itm.hasNext())
						s=s+(itm.next().getNumMesa())+",";
				}
				//finalmente incluimos el numero de comensales
				s=s+"("+ p.getNumComensales()+" comensales)";					
				listaModelo.addElement(s);
			}				
		}		
	}

	/**
	 * 
	 * Gestion de eventos de boton
	 */
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Volver"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new MenuPrincipal(r).setVisible(true);			
		}	
		else if(e.getActionCommand().equals("Nuevo")) 
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new CrearAmpliarPedido(r).setVisible(true);			
		}
		else if (e.getActionCommand().equals("Ampliar"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new CrearAmpliarPedido(r,this.pedidoSeleccionado).setVisible(true);			
		}	
		else if (e.getActionCommand().equals("Editar"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new EditarConsumiciones(r,pedidoSeleccionado).setVisible(true);			
		}
		else if (e.getActionCommand().equals("Eliminar"))
		{
			int respuesta;
				
			respuesta = JOptionPane.showConfirmDialog(
					this, 
					"¿Está seguro de que desea eliminar el pedido "+listaModelo.getElementAt(jLPedidos.getSelectedIndex())+"?",
					"Confirmar eliminación del pedido",
					JOptionPane.YES_NO_OPTION,
					JOptionPane.QUESTION_MESSAGE
					);			
			if(respuesta==JOptionPane.YES_OPTION)
			{
				//intentamos eliminar el pedido de la BD
				if(r.eliminarPedido(this.pedidoSeleccionado.getCodPedido()))
				{
					//obtenemos la lista de pedidos directamente de la BD a través del objeto restaurante
					listaPedidos = r.recuperarPedidos();
					//refrescamos la lista de pedidos
					listaModelo.remove(this.jLPedidos.getSelectedIndex());
				}
				else	//el pedido no ha podido ser eliminado
				{
					JOptionPane.showMessageDialog(
							this,
							"El pedido '"+listaModelo.getElementAt(jLPedidos.getSelectedIndex())+"' no ha podido ser eliminado.",
							"ERROR al eliminar pedido",
							JOptionPane.ERROR_MESSAGE);
				}					
			}			
		}
	}
	/**
	 * 
	 * Gestion de eventos de seleccion
	 */
	public void valueChanged(ListSelectionEvent e) 
	{
		//cada vez que se seleccione o se deseleccione un elemento de la lista actualizaremos este atributo
		int index = getJLPedidos().getSelectedIndex();
		if(index < 0)
			pedidoSeleccionado=null;
		else
			pedidoSeleccionado = this.listaPedidos.get(index);
		
		//no hay ningún elemento seleccionado
		if( ((JList)(e.getSource())).isSelectionEmpty())
		{
			this.getJBAmpliar().setEnabled(false);
			this.getJBEliminar().setEnabled(false);
			this.getJBEditar().setEnabled(false);
		}			
		//hay al menos un elemento seleccionado
		else
		{
			this.getJBAmpliar().setEnabled(true);
			this.getJBEliminar().setEnabled(true);
			this.getJBEditar().setEnabled(true);
		}		
	}
}
